package com.qf.service.impl;

import com.qf.dao.UserDao;
import com.qf.dao.impl.UserDaoImpl;
import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.util.CodeUtil;
import com.qf.util.DbUtils;
import com.qf.util.EmailUtils;
import com.qf.util.MD5Util;

/**
 * @Author AzureSky_X
 * @Date 2020/11/16 18:48
 * @Version 1.0
 */
public class UserServiceImpl implements UserService {
    private UserDao dao=new UserDaoImpl();
    @Override
    public int checkUserName(String username) {
        int result=0;
        try {
            DbUtils.begin();
            User user = dao.selectUserByUserName(username);
            if(user!=null){
                result=1;
            }
            DbUtils.commit();
        }catch (Exception e){
            DbUtils.rollback();
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public int register(User u) {
        int result=0;
        try {
            DbUtils.begin();

            //思考？此时密码是123456，如果将这样的明文密码存储在数据库中，对于安全性来说，
            //一般情况下密码这样的字段是需要加密
            //加密算法：常见分为可逆加密和不可逆加密
            //密码的加密采取的不可逆加密
            //不可逆加密有：MD5加密：可以将不定长的的字符串通过加密之后的得到是固定的16个长度的字符串，但是被中国的一个数学家
            //             SHA家族：SHA-1,SHA-256,SHA-384:将不定长度字符串加密后得到固定长度的字符串
            //由于密码常见是6位的，范围是固定的，所以网上有人将每一个都加密，将明文和密文以键值对的形式存储，当有人记得密文时，就可以找到明文
            //常见的加密算法是：迭代加密，但是出现问题是：相同的密码加密出来的结果是一样的吧，所以可能出现不安全
            //                 盐值加密
            //开发常用的是迭代+盐值

            String str=u.getPassword()+u.getUsername();
            for(int i=0;i<1000;i++){
                str=MD5Util.getMD5(str);
            }
            //将经过1000次盐值加密的密文进行存储

            u.setPassword(str);
            u.setActive_code(CodeUtil.getUUIDCode());
            result = dao.insertUserByUser(u);

            if(result==1){
                //发邮件到你的注册邮箱

                //10.31.158.38:8080//user?action=active&activeCode=user.getActive_code();
                EmailUtils.sendEmail(u);
            }
            DbUtils.commit();
        }catch (Exception e){
            DbUtils.rollback();
            e.printStackTrace();
        }
        return result;
    }

    @Override
    public int active(String activeCode) {
        int a=0;
        try{
            DbUtils.begin();
            a=dao.updateStatusByActiveCode(activeCode);
            DbUtils.commit();
        }catch (Exception e){
            DbUtils.rollback();
            e.printStackTrace();
        }
        return a;
    }

    @Override
    public User login(String username, String password) {

        User user=null;
        try{
            DbUtils.begin();
            user= dao.selectUserByUserName(username);
            DbUtils.commit();
        }catch (Exception e){
            DbUtils.rollback();
            e.printStackTrace();
        }

        //对密码进行注册时相同的加密方式
        String str=password+username;
        for(int i=0;i<1000;i++){
            str= MD5Util.getMD5(str);
        }


        if(user.getPassword().equals(str)){
            return user;
        }
        return null;
    }
}
